import MySQLdb
import MySQLdb.cursors
import servers
import utiles

host=servers.host
user=servers.user
passwd=servers.passwd
db_name=servers.db_name

def conectaComun(CONECTADO):
    db = None
    if CONECTADO != None:
        try:
            db=MySQLdb.connect(host=host[CONECTADO],user=user[CONECTADO],passwd=passwd[CONECTADO],db=db_name[CONECTADO])
            print "Conectado con ->",CONECTADO,host[CONECTADO]
            return (db, CONECTADO)
        except:
            CONECTADO = None
    for i,server in enumerate(host):
        try:
            db=MySQLdb.connect(host=server,user=user[i],passwd=passwd[i],db=db_name[i])
            CONECTADO = i
            print "Conectado con",CONECTADO,server
            return (db, CONECTADO)
        except:
            #no logro la conexion
            print "Imposible conectar a",i,server
            CONECTADO = None
    return (db, CONECTADO)

def conectaConDic(CONECTADO):
    db = None
    if CONECTADO != None:
        try:
            db=MySQLdb.connect(host=host[CONECTADO],user=user[CONECTADO],passwd=passwd[CONECTADO],db=db_name[CONECTADO], cursorclass=MySQLdb.cursors.DictCursor)
            print "Conectado con ->",CONECTADO,host[CONECTADO]
            return (db, CONECTADO)
        except:
            CONECTADO = None
    for i,server in enumerate(host):
        try:
            db=MySQLdb.connect(host=server,user=user[i],passwd=passwd[i],db=db_name[i], cursorclass=MySQLdb.cursors.DictCursor)
            print "Conectado con",i,server
            CONECTADO = i
            return (db, CONECTADO)
        except:
            #no logro la conexion
            print "Imposible conectar a",i,server
            CONECTADO = None
    return (db, CONECTADO)

def executa(self, sql, CONECTADO):
    db, CONECTADO = conectaComun(CONECTADO)
    if db == None: return ([], CONECTADO)
    c=db.cursor()
    utiles.logBD("executa: "+sql)
    c.execute(sql)
    ultimoid = db.insert_id()
    c.execute("set autocommit = 1")
    c.close()
    return (ultimoid, CONECTADO)

# ejecuta la consulta pasada por argumento
# devuelve todos los resultados
def ordenCruda(consulta, CONECTADO):
    db, CONECTADO = conectaComun(CONECTADO)
    if db == None: return ([], CONECTADO)
    c=db.cursor()
    c.execute(consulta)
    utiles.logBD("ordenCruda: " + consulta)
    aux = c.fetchall()
    c.close()
    db.close()
    return (aux, CONECTADO)
    
def ordenCrudaDict(consulta, CONECTADO, previo="SELECT 1"):
    db, CONECTADO = conectaConDic(CONECTADO)
    if db == None: return ([], CONECTADO)
    c=db.cursor()
    utiles.logBD("ordenCrudaDict: " + consulta)
    c.execute(previo)
    c.execute(consulta)
    aux = c.fetchall()
    c.close()
    db.close()
    return (aux, CONECTADO)

def ordenCrudaResultDict(consulta, CONECTADO, previo="SELECT 1"):
    db, CONECTADO = conectaConDic(CONECTADO)
    if db == None: return ([], CONECTADO)
    c=db.cursor()
    utiles.logBD("ordenCrudaResultDict: "+consulta)
    c.execute(previo)
    c.execute(consulta)
    result = c.fetchall()
    c.close()
    db.close()
    
    if len(result):		
        return (result[0], CONECTADO)
    return ([], CONECTADO)
